package com.zyf.concurrency.chapter16;

import com.zyf.concurrency.annotations.ThreadSafe;

import java.util.HashMap;
import java.util.Map;

/**
 * 不可变对象的初始化安全性
 * 引自原文：
 *      然而，许多对SafaStates的细微修改都可能破坏它的线程安全性。如果states不是final类
 * 型，或者存在除构造函数以外的其他方法能修改states,那么初始化安全性将无法确保在缺少
 * 同步的情况下安全地访问SafeStates。如果在SafeStates 中还有其他的非final域，那么其他线
 * 程仍然可能看到这些域上的不正确的值。这也导致了对象在构造过程中逸出，从而使初始化安
 * 全性的保证无效。
 * create by yifeng
 */
@ThreadSafe
public class SafeStates {
    private final Map<String, String> states;

    // final类型的states可以确保在构造函数中安全的构造完成，但是在在其他方法修改state中的元素，
    // 那么安全性将无法确保
    public SafeStates() {
        states = new HashMap<String, String>();
        states.put("alaska", "AK");
        states.put("alabama", "AL");
        /*...*/
        states.put("wyoming", "WY");
    }

    public String getAbbreviation(String s) {
        return states.get(s);
    }
}
